package com.wzp.weiliao.controller;


import com.wzp.weiliao.enmus.OperatorFriendRequestTypeEnum;
import com.wzp.weiliao.enmus.SearchFriendsStatusEnum;
import com.wzp.weiliao.entity.Users;
import com.wzp.weiliao.entity.bo.UsersBo;
import com.wzp.weiliao.entity.vo.MyFriendsVo;
import com.wzp.weiliao.entity.vo.UserVo;
import com.wzp.weiliao.service.Userservice;
import com.wzp.weiliao.utils.FastDFSClient;
import com.wzp.weiliao.utils.FileUtils;
import com.wzp.weiliao.utils.MD5Utils;
import com.wzp.weiliao.utils.WeiLiaoJSONResult;
import org.apache.commons.lang3.StringUtils;

import org.springframework.beans.BeanUtils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * @author 王振鹏
 * @version 1.0
 * @date 2019/8/8 10:17
 * @Description: 用户注册/登录
 */
@RestController
@RequestMapping("user")

public class UserController {
    @Autowired
    private Userservice userService;
    @Autowired
    private FastDFSClient fastDFSClient;




    @PostMapping("/registorlogin")
    public WeiLiaoJSONResult registOrlogin(@RequestBody Users user) throws Exception {
        //0.判断用户名和密码不能为空
        //StringUtils 工具类判断是否为空
        if (StringUtils.isBlank(user.getUsername())||StringUtils.isBlank(user.getPassword())){
            return WeiLiaoJSONResult.errorMsg("用户名或密码不能为空...");
        }
        // 1. 判断用户名是否存在，如果存在就登录，如果不存在则注册
        boolean usernameIsExist = userService.queryUsernameIsExist(user.getUsername());
        Users userResult = null;
        if (usernameIsExist){
            //1.1登录
            userResult =  userService.queryUserForLogin(user.getUsername(),MD5Utils.getMD5Str(user.getPassword()));
            if (userResult==null){
                return WeiLiaoJSONResult.errorMsg("用户名或密码不正确...");
            }
        }else {
            //1.2注册

            user.setNickname(user.getUsername());
            user.setFaceImage("");
            user.setFaceImageBig("");
            user.setQrcode("");
//            System.out.println("测试"+user.getQrcode());
            user.setPassword(MD5Utils.getMD5Str(user.getPassword()));
            userResult = userService.saveUser(user);
            System.out.println("结果"+userResult);

        }
        UserVo userVo = new UserVo();
        BeanUtils.copyProperties(userResult, userVo);
        System.out.println("测试1"+userVo.getNickname());
        return WeiLiaoJSONResult.ok(userVo);
    }
    /**
     * @Description: 上传用户头像
     */
    @PostMapping("/uploadFaceBase64")
    public WeiLiaoJSONResult uploadFaceBase64(@RequestBody UsersBo userBo) throws Exception {
        // 获取前端传过来的base64字符串, 然后转换为文件对象再上传
        String base64Data = userBo.getFaceData();
        String userFacePath = "C:/img"+"/" + userBo.getUserId() + "userface64.png";
        System.out.println(userFacePath);
        // 上传文件到fastdfs
        FileUtils.base64ToFile(userFacePath, base64Data);
        MultipartFile facefile = FileUtils.fileToMultipart(userFacePath);
        String url =  fastDFSClient.uploadBase64(facefile);
        System.out.println(url);
        //		"1weawffcSDcxzcXCaSVDSggvB.png"
       //		"1weawffcSDcxzcXCaSVDSggvB_80x80.png"

      // 获取缩略图的url
        String thump = "_80x80.";
        String arr[] = url.split("\\.");
        String thumpImgUrl = arr[0] + thump + arr[1];
        // 更细用户头像
        Users user = new Users();
        user.setId(userBo.getUserId());
        user.setFaceImage(thumpImgUrl);
        user.setFaceImageBig(url);

        Users result = userService.updateUserInfo(user);

        return WeiLiaoJSONResult.ok(result);


    }
    /**
     * @Description: 设置用户昵称
     */
    @PostMapping("/setNickname")
    public WeiLiaoJSONResult setNickname(@RequestBody UsersBo userBo) throws Exception {

        Users user = new Users();
        user.setId(userBo.getUserId());
        user.setNickname(userBo.getNickname());

        Users result = userService.updateUserInfo(user);

        return WeiLiaoJSONResult.ok(result);
    }
    /**
     * @Description: 搜索好友接口
     */
    @PostMapping("/search")
    public WeiLiaoJSONResult searchUser(String myUserId,String friendUsername) throws Exception {

        // 0. 判断 myUserId friendUsername 不能为空
        if (StringUtils.isBlank(myUserId)
                || StringUtils.isBlank(friendUsername)) {
            return WeiLiaoJSONResult.errorMsg("");
        }

        // 前置条件 - 1. 搜索的用户如果不存在，返回[无此用户]
        // 前置条件 - 2. 搜索账号是你自己，返回[不能添加自己]
        // 前置条件 - 3. 搜索的朋友已经是你的好友，返回[该用户已经是你的好友]

        Integer status = userService.preconditionSearchFriends(myUserId, friendUsername);
        if (status == SearchFriendsStatusEnum.SUCCESS.status){
            Users users = userService.queryUserInfoByUsername(friendUsername);
            UserVo userVo = new UserVo();
            BeanUtils.copyProperties(users,userVo);
            return WeiLiaoJSONResult.ok(userVo);

        }else {
          String errormage = SearchFriendsStatusEnum.getMsgByKey(status);
          return WeiLiaoJSONResult.errorMsg(errormage );
        }

    }
    /**
     * @Description: 发送添加好友的请求
     */
    @PostMapping("/addFriendRequest")
    public WeiLiaoJSONResult addFriendRequest(String myUserId, String friendUsername)
            throws Exception {

        // 0. 判断 myUserId friendUsername 不能为空
        if (StringUtils.isBlank(myUserId)
                || StringUtils.isBlank(friendUsername)) {
            return WeiLiaoJSONResult.errorMsg("");
        }

        // 前置条件 - 1. 搜索的用户如果不存在，返回[无此用户]
        // 前置条件 - 2. 搜索账号是你自己，返回[不能添加自己]
        // 前置条件 - 3. 搜索的朋友已经是你的好友，返回[该用户已经是你的好友]
        Integer status = userService.preconditionSearchFriends(myUserId, friendUsername);
        if (status == SearchFriendsStatusEnum.SUCCESS.status) {
            userService.sendFriendRequest(myUserId, friendUsername);
        } else {
            String errorMsg = SearchFriendsStatusEnum.getMsgByKey(status);
            return WeiLiaoJSONResult.errorMsg(errorMsg);
        }

        return WeiLiaoJSONResult.ok();
    }
    /**
     * @Description: 发送添加好友的请求
     */
    @PostMapping("/queryFriendRequests")
    public WeiLiaoJSONResult queryFriendRequests(String userId) {
        // 0. 判断不能为空
        if (StringUtils.isBlank(userId)) {
            return WeiLiaoJSONResult.errorMsg("");
        }

        // 1. 查询用户接受到的朋友申请
        System.out.println(userService.queryFriendRequestList(userId));
        return WeiLiaoJSONResult.ok(userService.queryFriendRequestList(userId));
    }
    /**
     * @Description: 接受方 通过或者忽略朋友请求
     */
    @PostMapping("/operFriendRequest")
    public WeiLiaoJSONResult operFriendRequest(String acceptUserId, String sendUserId,
                                             Integer operType) {

        // 0. acceptUserId sendUserId operType 判断不能为空
        if (StringUtils.isBlank(acceptUserId)
                || StringUtils.isBlank(sendUserId)
                || operType == null) {
            return WeiLiaoJSONResult.errorMsg("");
        }

        // 1. 如果operType 没有对应的枚举值，则直接抛出空错误信息
        if (StringUtils.isBlank(OperatorFriendRequestTypeEnum.getMsgByType(operType))) {
            return WeiLiaoJSONResult.errorMsg("");
        }

        if (operType == OperatorFriendRequestTypeEnum.IGNORE.type) {
            // 2. 判断如果忽略好友请求，则直接删除好友请求的数据库表记录
            userService.deleteFriendRequest(sendUserId, acceptUserId);
        } else if (operType == OperatorFriendRequestTypeEnum.PASS.type) {
            // 3. 判断如果是通过好友请求，则互相增加好友记录到数据库对应的表
            //	   然后删除好友请求的数据库表记录
            userService.passFriendRequest(sendUserId, acceptUserId);
        }

        // 4. 数据库查询好友列表
        List<MyFriendsVo> myFirends = userService.queryMyFriends(acceptUserId);

        return WeiLiaoJSONResult.ok(myFirends);
    }
    /**
     * @Description: 查询我的好友列表
     */
    @PostMapping("/myFriends")
    public WeiLiaoJSONResult myFriends(String userId) {
        // 0. userId 判断不能为空
        if (StringUtils.isBlank(userId)) {
            return WeiLiaoJSONResult.errorMsg("");
        }

        // 1. 数据库查询好友列表
        List<MyFriendsVo> myFirends = userService.queryMyFriends(userId);

        return WeiLiaoJSONResult.ok(myFirends);
    }
    /**
     *
     * @Description: 用户手机端获取未签收的消息列表
     */
    @PostMapping("/getUnReadMsgList")
    public WeiLiaoJSONResult getUnReadMsgList(String acceptUserId) {
        // 0. userId 判断不能为空
        if (StringUtils.isBlank(acceptUserId)) {
            return WeiLiaoJSONResult.errorMsg("");
        }

        // 查询列表
        List<com.wzp.weiliao.netty.ChatMsg> unreadMsgList = userService.getUnReadMsgList(acceptUserId);

        return WeiLiaoJSONResult.ok(unreadMsgList);
    }
}
